﻿
//
// 版权所有 (c) 2021-2023 JR
//
// 特此免费授予获得本软件的任何人以处理本软件的权利，但须遵守以下条件：在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他责任负责，无论是因合同、侵权或其他方式引起的，与软件或其使用或其他交易有关。

namespace EMC.VISITOR.Core;

/// <summary>
/// 当前登录用户
/// </summary>
public class UserManager : IScoped
{
    private readonly SqlSugarRepository<SysUser> _repository;
    private readonly IHttpContextAccessor _httpContextAccessor;
    private long _tenantId;

    public readonly IHttpContextAccessor _TemphttpContextAccessor;
    public long UserId
    {

        get => long.Parse(_httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.UserId)?.Value);
    }

    public long TenantId
    {
        get
        {
            var tId = _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.TenantId)?.Value;
            return string.IsNullOrWhiteSpace(tId) ? _tenantId : long.Parse(tId);
        }
        set => _tenantId = value;
    }

    public string Account
    {
        get => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.Account)?.Value;
    }

    public string RealName
    {
        get => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.RealName)?.Value;
    }

    public bool SuperJR
    {
        get => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.AccountType)?.Value == ((int)AccountTypeEnum.SuperJR).ToString();
    }

    public long OrgId
    {
        get
        {
            var orgId = _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.OrgId)?.Value;
            return string.IsNullOrWhiteSpace(orgId) ? 0 : long.Parse(orgId);
        }
    }

    public string OpenId
    {
        get => _httpContextAccessor.HttpContext?.User.FindFirst(ClaimConst.OpenId)?.Value;
    }


    public UserManager(IHttpContextAccessor httpContextAccessor)
    {
        _TemphttpContextAccessor = _httpContextAccessor = httpContextAccessor;
    }

    public async Task<List<long>> SysUserCanUseStationIds(ISqlSugarClient _db)
    {
        var sysUser = await _db.MyQueryable<SysUser>().FirstAsync(r => r.Id == UserId);
        if (sysUser == null || sysUser.KeyPathList.Length <= 0)
        {
            return new List<long>();
        }
        return sysUser.KeyPathList.Select(r => Convert.ToInt64(r)).ToList();
    }

    public async Task<List<string>> SysUserCanUseStationCodes(ISqlSugarClient _db)
    {
        var sysUser = await _db.MyQueryable<SysUser>().FirstAsync(r => r.Id == UserId);
        if (sysUser == null || sysUser.StationCodeList.Length <= 0)
        {
            return new List<string>();
        }
        return sysUser.StationCodeList.Select(r => r).ToList();
    }
}